#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

//可以被多个执行流执行，show函数被可重入了
void show(const string &name)
{
    cout<<name<<"say#"<<"hello thread"<<endl;
}

void *threadRoutine(void *args)//线程的参数和返回值，不仅仅可以用来进行传递一般参数，还可以传递对象
{
    int cnt=5;
    while (true)
    {
        cout << "new thread,pid:" << getpid() << endl;
        //show("new thread");
        sleep(1);
        cnt--;
        if(cnt==0)break;
    }
    //pthread_exit((void*)1);//终止自己
    //exit(1);//exit是用来终止进程的，会直接终止进程
    return (void*)1;//走到这默认线程就退出了
}

int main()
{
    pthread_t tid;                              //参数可以传很多，字符串，类的对象的指针...
    pthread_create(&tid, nullptr, threadRoutine, nullptr); // 这个接口不是系统调用
    // 这是第三方库，必须要指明 -lpthread
    // 这个库默认有，编译器默认能找到路径，但是不知道链接哪个库

    //sleep(1);
    //pthread_cancel(tid);//取消一个执行的线程，线程返回值设置为-1
    while (true)
    {
        cout << "main thread,pid:" << getpid() << endl;
        //show("main thread");
        sleep(1);
    }
    
    void* retval;
    pthread_join(tid,&retval);//线程等待,默认是阻塞等待的
                            //为什么线程不考虑异常，因为如果线程出异常，主线程也挂了
    cout<<"main thread quit ... ret"<<(long int)retval<<endl; 

    return 0;
}